/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Util;

import Negocio.Premisa;
import Negocio.Regla;
import Negocio.SolicitudPrestamo;
import java.util.ArrayList;
import java.util.Vector;

/**
 * Gestor de inferencia
 * Recibe un objeto de solicitud y busca las reglas que pueden aplicársele para deducir la morosidad
 *
 * @author Javi
 */
final public class GestorInferencia {

    private static GestorInferencia _INSTANCIA = new GestorInferencia();

    private Vector _columnIdentifiersRegla;
    private Vector _dataVectorRegla;
    private Vector _columnIdentifiersPremisa;
    private Vector _dataVectorPremisa;
    private ArrayList<Regla> _alReglas;
    private Regla _oRegla;
    private Premisa _oPremisa;

    private GestorInferencia (){
        super();
        this._oRegla = new Regla();
        this._oPremisa = new Premisa();
        this._columnIdentifiersRegla = new Vector ();
        this._dataVectorRegla = new Vector ();
        this._columnIdentifiersPremisa = new Vector ();
        this._dataVectorPremisa = new Vector ();
    }

    public static GestorInferencia getInstancia (){
        return _INSTANCIA;
    }

    public ArrayList<Regla> evaluaSolicitud ( SolicitudPrestamo oSolicitud){
        ArrayList<Regla> alRegla = new ArrayList<Regla> ();
        Vector dataRowRegla;
        Vector dataRowPremisa;
        boolean bCumpleRegla;
        //Paso 1: Cargar las reglas existentes en un ArrayList
        //Inicializo los vectores
        this._columnIdentifiersRegla.clear();
        this._dataVectorRegla.clear();
        this._oRegla.selectAll(this._columnIdentifiersRegla, this._dataVectorRegla);
        for (int i=0; i < this._dataVectorRegla.size(); i++){
            // Se crea un vector que será cada fila de la tabla.
            dataRowRegla = (Vector) this._dataVectorRegla.get(i);
            //Cargo el objeto con los datos de la regla leídos
            this._oRegla.vectorJTableAClase (this._columnIdentifiersRegla, dataRowRegla);
            //TRATAMIENTO DE REGLA
            //Recupero sus premisas
            //Inicializo los vectores
            this._columnIdentifiersPremisa.clear();
            this._dataVectorPremisa.clear();
            this._oPremisa.setsCondWhere(" IdRegla = " + this._oRegla.getiIdRegla());
            this._oPremisa.selectAll(this._columnIdentifiersPremisa, this._dataVectorPremisa);
            //Si la regla NO TIENE PREMISAS paso a la siguiente REGLA
            if (this._dataVectorPremisa.size() == 0)
                continue;
            //TRATAMIENTO DE PREMISAS DE LA REGLA
            //Inicializamos a verdadero
            bCumpleRegla = true;
            for (int j=0; j < this._dataVectorPremisa.size(); j++){
                dataRowPremisa = (Vector) this._dataVectorPremisa.get(j);
                this._oPremisa.vectorJTableAClase(this._columnIdentifiersPremisa, dataRowPremisa);
                if ( !oSolicitud.evaluaPremisa(_oPremisa) ){
                    bCumpleRegla = false;
                    break;  //Salgo y no sigo evaluando el resto de premisas de la regla
                }
            }
            //Si se cumplen TODAS las premisas de la regla
            if (bCumpleRegla){
                Regla reglaAux = new Regla();
                //Cargo sus datos del Vector
                reglaAux.vectorJTableAClase(this._columnIdentifiersRegla, dataRowRegla);
                //La añado al array list
                alRegla.add(reglaAux);
            }
        }
        //Devuelvo el array con las reglas que cumple la solicitud
        return alRegla;
    }
}